// 版权所有2009 Go作者。版权所有。
// 此源代码的使用受BSD样式
// 许可证的约束，该许可证可以在许可证文件中找到。

package base

import (
	"os"
)

var atExitFuncs []func()

func AtExit(f func()) {
	atExitFuncs = append(atExitFuncs, f)
}

func Exit(code int) {
	for i := len(atExitFuncs) - 1; i >= 0; i-- {
		f := atExitFuncs[i]
		atExitFuncs = atExitFuncs[:i]
		f()
	}
	os.Exit(code)
}

const EnableTrace = false

func Compiling(pkgs []string) bool {
	if Ctxt.Pkgpath != "" {
		for _, p := range pkgs {
			if Ctxt.Pkgpath == p {
				return true
			}
		}
	}

	return false
}

// 赛马场通行证目前分三部分办理。
// 
// 首先，对于flag_race，它在每个
// racefuncexit的调用。这在下面处理。
// 函数的开始和结束处（分别）插入对racefuncenter和
// 
// 第二，在构建SSA过程中，它会在每次内存加载或存储之前立即插入适当的检测
// 调用。这是由（*州）处理的
// 。ssa中的仪器方法。开始，我们在这里设置
// 函数。根据需要设置仪表板标志。关于为什么这个
// 是在SSA建设期间完成的，而不是单独的SSA通行证，
// 见第19054期。
// 
// 第三，我们删除了对racefuncenter和racefuncexit的调用，用于不带指令化操作的叶
// 函数。这是
// ssa通过特殊规则选择通行证的一部分。

// TODO（dvyukov）：不要像写入那样插入初始化：
// a:=make（[]int，10）

// 完全不要插入以下包，
// 充其量插入将导致无限递归。
var NoInstrumentPkgs = []string{
	"runtime/internal/atomic",
	"runtime/internal/math",
	"runtime/internal/sys",
	"runtime/internal/syscall",
	"runtime",
	"runtime/race",
	"runtime/msan",
	"runtime/asan",
	"internal/cpu",
}

// 不要将racefuncenter/racefuncexit插入以下软件包。
// 软件包中的内存访问要么无趣，要么会导致误报。
var NoRacePkgs = []string{"sync", "sync/atomic"}
